<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>构造函数</title>
</head>
<body>
<script>
    function Person(){
        this.name = "Alice"
    }

    /*
     注意构造函数这样直接调用的话就相当于为window上面绑定属性
    * */
    Person()


    function Animal(name, age) {
        this.name = name
        this.age = age
    }
    let animal ={
        a:1
    }
    /*
    * 构造函数可以从；另外一个角度去理解如果使用任意对象去调用的话那么构造函数可以动态的为任意对象定义属性
    * */
    Animal.call(animal,'Alice',100)
    console.log(animal)

    /*
    * 为什么null和undefined都可以被指定为方法的调用者呢
    * 其实方法的调用者就是this 如果方法内部的逻辑是为this定义其他的属性的话那么就相当于为undefined或者null
    * 的身上定义属性，不会报错只不过结果还是undefined或者null而已
    *
    * 如果方法的逻辑是读取this身上的属性的话那么就会报错了因为undefined和null身上并没有那样的属性
    *
    * call/apply 这种操作可以理解为向函数内部不仅传递方法参数还将this进行传递
    *
    * */
    let a
    Animal.call(a,'a',120)
    console.log(a)

</script>
</body>
</html>